package cn.song.h5.pc.controller;

import cn.song.h5.pc.config.AlipayConfig;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * 支付宝控制器
 *
 * @author SongRenShuo
 * @date 2023/12/26
 */
@RestController
@RequestMapping("H5pc")
public class AlipayController {

    /**
     * 编码
     */
    private final String ENCODE = "UTF-8";
    @Autowired
    private HttpServletRequest request;


    /**
     * 付款
     *
     * @return {@link String }
     * @date: 2023/12/26
     * @author SongRenShuo
     */
    @RequestMapping("pay")
    public String pay() throws Exception {
        // 获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        // 设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        // 商户订单号，商户网站订单系统中唯一订单号，必填
        String out_trade_no = getParameter("WIDout_trade_no");
        // 付款金额，必填
        String total_amount = getParameter("WIDtotal_amount");
        // 订单名称，必填
        String subject = getParameter("WIDsubject");
        // 商品描述，可空
        String body = getParameter("WIDbody");

        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","
                                    + "\"total_amount\":\"" + total_amount + "\","
                                    + "\"subject\":\"" + subject + "\","
                                    + "\"body\":\"" + body + "\","
                                    + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        // 请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        System.err.println(result);
        // 输出
        return result;
    }


    /**
     * 交易查询
     *
     * @return {@link String }
     * @date: 2023/12/26
     * @author SongRenShuo
     */
    @RequestMapping("query")
    public String query() throws Exception {
        // 获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        // 设置请求参数
        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();

        // 商户订单号，商户网站订单系统中唯一订单号
        String out_trade_no = getParameter("WIDTQout_trade_no");
        // 支付宝交易号
        String trade_no = getParameter("WIDTQtrade_no");
        // 请二选一设置

        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"trade_no\":\"" + trade_no + "\"}");

        // 请求
        String result = alipayClient.execute(alipayRequest).getBody();

        // 输出
        return result;
    }

    /**
     * 退款
     *
     * @return {@link String }
     * @date: 2023/12/26
     * @author SongRenShuo
     */
    @RequestMapping("refund")
    public String refund() throws Exception {
        // 获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        // 设置请求参数
        AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();

        // 商户订单号，商户网站订单系统中唯一订单号
        String out_trade_no = getParameter("WIDTRout_trade_no");
        // 支付宝交易号
        String trade_no = getParameter("WIDTRtrade_no");
        // 请二选一设置
        // 需要退款的金额，该金额不能大于订单金额，必填
        String refund_amount = getParameter("WIDTRrefund_amount");
        // 退款的原因说明
        String refund_reason = getParameter("WIDTRrefund_reason");
        // 标识一次退款请求，同一笔交易多次退款需要保证唯一，如需部分退款，则此参数必传
        String out_request_no = getParameter("WIDTRout_request_no");

        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","
                                    + "\"trade_no\":\"" + trade_no + "\","
                                    + "\"refund_amount\":\"" + refund_amount + "\","
                                    + "\"refund_reason\":\"" + refund_reason + "\","
                                    + "\"out_request_no\":\"" + out_request_no + "\"}");

        // 请求
        String result = alipayClient.execute(alipayRequest).getBody();

        // 输出
        return result;
    }

    /**
     * 退款查询
     *
     * @return {@link String }
     * @date: 2023/12/26
     * @author SongRenShuo
     */
    @RequestMapping("refundQuery")
    public String refundQuery() throws Exception {
        // 获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        // 设置请求参数
        AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest();

        // 商户订单号，商户网站订单系统中唯一订单号
        String out_trade_no = getParameter("WIDRQout_trade_no");
        // 支付宝交易号
        String trade_no = getParameter("WIDRQtrade_no");
        // 请二选一设置
        // 请求退款接口时，传入的退款请求号，如果在退款请求时未传入，则该值为创建交易时的外部交易号，必填
        String out_request_no = getParameter("WIDRQout_request_no");

        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","
                                    + "\"trade_no\":\"" + trade_no + "\","
                                    + "\"out_request_no\":\"" + out_request_no + "\"}");

        // 请求
        String result = alipayClient.execute(alipayRequest).getBody();

        // 输出
        return result;
    }

    /**
     * 交易关闭
     *
     * @return {@link String }
     * @date: 2023/12/26
     * @author SongRenShuo
     */
    @RequestMapping("close")
    public String close() throws Exception {
        // 获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        // 设置请求参数
        AlipayTradeCloseRequest alipayRequest = new AlipayTradeCloseRequest();
        // 商户订单号，商户网站订单系统中唯一订单号
        String out_trade_no = getParameter("WIDTCout_trade_no");
        // 支付宝交易号
        String trade_no = getParameter("WIDTCtrade_no");
        // 请二选一设置

        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"trade_no\":\"" + trade_no + "\"}");

        // 请求
        String result = alipayClient.execute(alipayRequest).getBody();

        // 输出
        return result;
    }

    /**
     * 获取参数值
     */
    public String getParameter(String name) throws Exception {

        return new String(this.request.getParameter(name).getBytes(ENCODE), ENCODE);
    }
}
